package com.aaa.common.util;




import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

/**
 * @ fileName:OssUtil
 * @ description: 阿里云对象存储工具类
 * @ author:zhz
 * @ createTime:2023/4/7 9:41
 * @ version:1.0.0
 */
public class OssUtil {
    /*// Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
    private  static  final  String END_POINT = "https://oss-cn-beijing.aliyuncs.com";
    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    private  static  final  String ACCESS_KEY_ID = "LTAI5tSGe5xqCrJuRyb1oQsY";
    private  static  final  String ACCESS_KEY_SECRET = "9i7bBOh0dcOeOSp8oBFmqLs19LMrL2";
    // 填写Bucket名称，例如examplebucket。
    private  static  final  String BUCKET_NAME = "qy164-wangzherongyao-bucket";*/

    //public  static  final String BUCKET_DAEMON = "https://qy164-wangzherongyao-bucket.oss-cn-beijing.aliyuncs.com/";

    /**
     * 通用的文件上传方法
     * @param inputStream  文件对象的输入流
     * @param savePath   保存路径（任意路径+文件名称）
     *                   填写Object完整路径，完整路径中不能包含Bucket名称，例如  /scenic/imgs/xxxxx.jpg。
     * @return
     */
    public static  boolean uploadFile(InputStream inputStream,String savePath){

        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如  /scenic/imgs/xxxxx.jpg。
        //String objectName = "/scenic/imgs/xxxxx.jpg";
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        //String filePath= "D:\\localpath\\examplefile.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ConstantUtil.FileHandlerConfig.END_POINT,
                ConstantUtil.FileHandlerConfig.ACCESS_KEY_ID,
                ConstantUtil.FileHandlerConfig.ACCESS_KEY_SECRET);

        try {
            //InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(ConstantUtil.FileHandlerConfig.BUCKET_NAME,
                    savePath, inputStream);
            // 设置该属性可以返回response。如果不设置，则返回的response为空。
            putObjectRequest.setProcess("true");
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // 如果上传成功，则返回200。
            int statusCode = result.getResponse().getStatusCode();
            System.out.println(statusCode);
            // 判断返回值是否是200
            if(statusCode==200){
                return  true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }   finally {
            //关闭上传对象
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return false;
    }


    /**
     * 通用下载方法
     * @param filePath   https://qy164-wangzherongyao-bucket.oss-cn-beijing.aliyuncs.com/dept/a/b/c/d/691cddae-1d85-4e4b-ac7d-903c2201197b.jpg
     * @param response   响应对象
     */
    public static void downloadFile(String filePath, HttpServletResponse response){
        OSS ossClient = null;
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        //filePath = https://qy149bucket.oss-cn-beijing.aliyuncs.com/a/b/c/b57fb665-5619-4aea-8ea9-2da72bbf78df.png

        String fileName  =  filePath.substring(filePath.lastIndexOf("/")+1);
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(ConstantUtil.FileHandlerConfig.END_POINT,
                    ConstantUtil.FileHandlerConfig.ACCESS_KEY_ID,
                    ConstantUtil.FileHandlerConfig.ACCESS_KEY_SECRET);
            // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            OSSObject ossObject = ossClient.getObject(ConstantUtil.FileHandlerConfig.BUCKET_NAME,
                    filePath);
            //得到要下载对象得输入流
            //设置下载文件的头部信息     attachment  附件
            response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));//文件名如果包含中文需要指定编码
            //字节输出流  下载的本质把服务上的文件对象变成输入流（内存）   然后把输入流的内容输出到相应对象HttpServletResponse的输出流中
            //套接缓存流，让下载文件速度提高
            bufferedInputStream =new BufferedInputStream(ossObject.getObjectContent());
            bufferedOutputStream =new BufferedOutputStream( response.getOutputStream());
            //定义缓存字节数组
            byte[]  bytes = new byte[2048];
            //定义每次读取字节数
            int readNum = -1;
            //循环读写
            while((readNum=bufferedInputStream.read(bytes))!=-1){
                //System.out.println(readNum+".............................");
                //写入Response输出流
                bufferedOutputStream.write(bytes,0,readNum);
            }
            bufferedOutputStream.flush();
           /* readNum=bufferedInputStream.read(bytes);
            while(readNum!=0){
                readNum=bufferedInputStream.read(bytes);
            }*/
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ossClient.shutdown();
                if(bufferedOutputStream!=null){
                    bufferedOutputStream.close();
                }
                if(bufferedInputStream!=null){
                    bufferedInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
